<?php
class Pagination{
	private $php_self;
	private $rows_per_page=100;
	//Number of records to display per page
	public $total_resultados=0;
	//Total number of rows returned by the query
	public $total_resultados_html;
	//Código html que mostra os resultados da pesquisa
	private $links_per_page=5;
	//Number of links to display per page //numero impar � aconselhado
	public $append="";
	//Paremeters to append to pagination links
	public $append_second_page="";
	//Paremeters to append to pagination links
	private $page=1;
	private $max_pages=0;
	private $offset=0;
	private $db="";
	private $sql="";
	public $pesquisas;
	public $ordenacoes;
	public $ordenacao;
	private $search;
	public $search_original;
	public $direcao;
	public $link;
	public $titulo;
	public $query_ordenacao;
	private $direcoes=array("asc","desc");
	public $imagens;
	// imagens dos que n�o est�o ordenados
	public $imagem;
	//imagem do que est� ordenado
	public $titulo_html;
	public $keywordsPesquisa;

	function Pagination($db,$sql,$append,$pesquisas,$ordenacoes,$titulo,$coluna_a_ordenar_por_defeito,$ordem_a_ordenar_por_defeito){
		$this->ordenacao=$coluna_a_ordenar_por_defeito;
		$this->direcao=$ordem_a_ordenar_por_defeito;

		$this->pesquisas=$pesquisas;
		$this->ordenacoes=$ordenacoes;
		$this->titulo=$titulo;

		$this->db=$db;
		$this->sql=$sql;

		$this->append=$append;
		//para o search das segunda paginas
		$this->append_second_page=substr($this->append,5);
		//echo $this->append_second_page,'<br />';

		$this->php_self=htmlspecialchars($_SERVER['PHP_SELF']);
		if(isset($_GET['page'])){
			$this->page=intval($_GET['page']);
		}
	}
	/* Depend�ncia dos ficheiros titulo.tpl e comprador.css
	 * @usedby titulo.tpl comprador.css
	 * */
	function titulo(){
		global $smarty;
		$smarty->assign("titulo",$this->titulo);
	}
	private function calculaNumeroTotalDeResultados(){
		$sql=stristr($this->sql,'FROM');
		$sql="select count(*) ".$sql;
		$this->total_resultados=$this->db->GetOne($sql);
	}
	public function altera_cor($cor){
		echo '
			<style type="text/css">
		  	.page_link {
			background: none repeat scroll 0 0 #FFFFFF;
			color:'.$cor.';
			text-decoration: none;
			border: 1px solid '.$cor.';
			font-size: 10px;
			padding: 1px 4px;
			}
			.page_link:hover {
				color:white;
				border: 1px solid '.$cor.';
				background-color: '.$cor.';
			}
			.current_page_link {
			background: none repeat scroll 0 0 '.$cor.';
			text-decoration: none;
			color:#FFFFFF;
			font-weight: bold;
			}

		  	</style>
			';
	}
	public function paginate(){
		global $db,$VARS,$smarty,$tplConfigs;
		$this->altera_cor($tplConfigs['corBordoPagina']);

		//Search
		$this->search=isset($_REQUEST['search'])?$_REQUEST['search']:"";
		$this->search_original=$this->search;


		if(strlen(trim($this->search))!=0){
			$this->search="%".$this->search."%";
			$this->search=$db->qstr($this->search);

			$procuras=implode(" like $this->search or ",$this->pesquisas);
			$this->sql=$this->sql."and ($procuras  like $this->search)";

			$this->keywordsPesquisa=mysql_real_escape_string(trim($this->search_original));
			$smarty->assign("keywordsPesquisa",$this->keywordsPesquisa);
		}
		//echo $this->sql;
		//Coluna a ordenar e direcao


		if(isset($_REQUEST['direcao'])&&in_array($_REQUEST['direcao'],$this->direcoes)&&isset($_REQUEST['ordenacao'])&&in_array($_REQUEST['ordenacao'],$this->ordenacoes)){
			$this->direcao=$_REQUEST['direcao'];
			$this->ordenacao=$_REQUEST['ordenacao'];
		}
		$this->sql=$this->sql." order by ".$this->ordenacao." ".$this->direcao;
		$this->titulo();
		$smarty->assign("mostra_procura","sim");

		$this->calculaNumeroTotalDeResultados();
		$tamanho=count($this->ordenacoes);
		for($i=0; $i<$tamanho; $i++){
			//caso seja a coluna seleccionado para ordenacao
			if($this->ordenacoes[$i]==$this->ordenacao){
				//$this->link[$i] = $_SERVER["PHP_SELF"].'?menu='.$_REQUEST['menu'].
				$this->link[$i]=$_SERVER["PHP_SELF"]."?$this->append".
					/* '&search='.$this->search_original. */
					'&search='.$this->search_original.
					'&ordenacao='.$this->ordenacao.
					'&direcao='.$this->troca_direcao($this->direcao);


				if($this->direcao=='desc'){
					$this->imagem[$i]='<img src="'.$VARS['IMAGE_DIR'].'desc.png"/>&nbsp;&nbsp;';
				}
				if($this->direcao=='asc'){
					$this->imagem[$i]='<img src="'.$VARS['IMAGE_DIR'].'asc.png"/>&nbsp;&nbsp;';
				}
			}else{
				//fica com ambas as imagens
				$this->link[$i]=$_SERVER["PHP_SELF"]."?$this->append".
					//'&search='.$this->search_original.
					'&search='.$this->search.
					'&ordenacao='.$this->ordenacoes[$i].
					'&direcao='.$this->direcoes[0];
				$this->imagem[$i]='<img src="'.$VARS['IMAGE_DIR'].'ascdesc.png"/>&nbsp;&nbsp;';
			}
		}
		$this->imprime_numero_de_resultados_da_pesquisa();
		//mantem a ordena��o durante a mudan�a de p�gina
		$this->append=$this->append.'&search='.$this->search_original.'&ordenacao='.$this->ordenacao.'&direcao='.$this->troca_direcao($this->direcao).'&ordenacao='.$this->ordenacao;
		//echo $this->append;

		$this->max_pages=ceil($this->total_resultados/$this->rows_per_page);
		if($this->links_per_page>$this->max_pages){
			$this->links_per_page=$this->max_pages;
		}
		if($this->page>$this->max_pages||$this->page<=0){
			$this->page=1;
		}
		$this->offset=$this->rows_per_page*($this->page-1);
		return $this->db->GetAll($this->sql." LIMIT {$this->offset}, {$this->rows_per_page}".';');
	}
	public function imprime_numero_de_resultados_da_pesquisa(){

		if($this->total_resultados==0){
			$this->total_resultados_html='<div style="text-align:right;font-family:sans-serif; font-size: 1.1em; font-style:normal; font-variant: normal;font-weight: lighter;">'.$this->total_resultados.' resultados encontrados</div>';
			return FALSE;
		}else{
			if($this->total_resultados==1){
				$this->total_resultados_html='<div style="text-align:right;font-family:sans-serif; font-size: 1.1em; font-style:normal; font-variant: normal;font-weight: lighter;">'.$this->total_resultados.' resultado encontrado</div>';
			}else{
				$this->total_resultados_html='<div style="text-align:right;font-family:sans-serif; font-size: 1.1em; font-style:normal; font-variant: normal;font-weight: lighter;">'.$this->total_resultados.' resultados encontrados</div>';
			}
		}
	}
	private function troca_direcao(){
		if($this->direcao=='desc'){
			$this->direcao='asc';
		}else{
			$this->direcao='desc';
		}
		return $this->direcao;
	}
	//$tag = '&gt;&gt;'
	//'&gt;'
	private function renderNext($tag = '&gt;'){
		if($this->total_resultados==0) return FALSE;

		$paginaDestinoSalto=min($this->page+$this->links_per_page,$this->max_pages);

		if($paginaDestinoSalto<$this->max_pages){
			return '<a class="page_link" href="'.$this->php_self.'?page='.($paginaDestinoSalto).'&'.$this->append.'">'.$tag.'</a>';
		}else{
			return '<span class="page_link">'."$tag ".'</span>';
		}
	}
	//$tag = '&lt;&lt;'
	//'&lt;'
	private function renderPrev($tag = '&lt;'){
		if($this->total_resultados==0) return FALSE;
		$paginaDestinoSalto=max($this->page-$this->links_per_page,1);
		if($paginaDestinoSalto>1){
			return ' <a class="page_link" href="'.$this->php_self.'?page='.($paginaDestinoSalto).'&'.$this->append.'">'.$tag.'</a>';
		}else{
			return '<span class="page_link">'."$tag ".'</span>';
		}
	}
	//private function renderNav($prefix = '<span class="page_link">', $suffix = '</span>') {
	private function renderNav($prefix = '',$suffix = ''){
		if($this->total_resultados==0) return FALSE;

		$start=$this->page-floor($this->links_per_page/2);
		$start=max(1,$start);
		$start=min($this->max_pages-$links_per_page,$start);

		$end=$start+$this->links_per_page;
		$end=min($this->max_pages,$end);

		if($end>$this->links_per_page){
			$start=$end-$this->links_per_page;
		}

		if($end==$this->page){
			$start=$end-$this->links_per_page+1;
		}
		$links='';

		if($start!=1&&$start!=$this->max_pages){
			$links .= $prefix.'<a class="page_link" href="'.$this->php_self.'?page='.'1'.'&'.$this->append.'">'.'1'.'</a>'.$suffix.' ... ';
		}

		for($i=$start; $i<$end; $i++){

			if($i==$this->page){
				$links .=$prefix."<a class='page_link current_page_link'>".$i."</a>";
			}else{
				$links .= ' '.$prefix.'<a class="page_link" href="'.$this->php_self.'?page='.$i.'&'.$this->append.'">'.$i.'</a>'.$suffix.' ';
			}
		}

		if($end==$this->max_pages&&$this->max_pages==$this->page){
			$links .= $prefix.'<a class="page_link current_page_link" href="'.$this->php_self.'?page='.$this->max_pages.'&'.$this->append.'">'.$this->max_pages.'</a>'.$suffix;
		}else{
			$links .= $prefix.'... <a class="page_link" href="'.$this->php_self.'?page='.$this->max_pages.'&'.$this->append.'">'.$this->max_pages.'</a>'.$suffix;
		}



		/*
		  if($end != $this->max_pages)
		  {
		  $links .= $prefix . '... <a class="page_link" href="' . $this->php_self . '?page=' . $this->max_pages . '&' . $this->append . '">' . $this->max_pages . '</a>' . $suffix ;
		  } */
		return $links;
	}
	public function renderFullNav(){
		//return  '<div class="fullnav" style="text-align:center;text-decoration: none;">'.$this->renderFirst() . '&nbsp;' . $this->renderPrev() . '&nbsp;' . $this->renderNav() . '&nbsp;' . $this->renderNext() . '&nbsp;' . $this->renderLast().'</div>';
		return '<div class="fullnav" style="text-align:center;text-decoration: none;">&nbsp;'.$this->renderPrev().'&nbsp;'.$this->renderNav().'&nbsp;'.$this->renderNext().'</div>';
	}
	function fillAppendFromRequestKeys($keys){

		foreach($keys AS $key){
			if(isset($_REQUEST[$key])){
				$this->append .= "$key={$_REQUEST[$key]}&";
			}else{
				$this->append .= "$key&";
			}
		}
	}
	public function getRowsPerPage(){
		return $this->rows_per_page;
	}
	public function setRowsPerPage($x){
		if(is_numeric($x)and$x>0){
			$this->rows_per_page=$x;
		}
	}
}